package professor;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import util.CommandLineParser;
import weka.classifiers.Evaluation;
import analyzers.TweetClassifier;

public class Tester {
	private static TweetClassifier classificadorBayesNet;
	private static TweetClassifier classificadorNaiveBayes;
	private static TweetClassifier classificadorArvore;

	public static void main(String[] args) throws Exception {
		if (args.length != 2) {
			System.err.println("Erro. Os parametros corretos sao: "
					+ "<dirHappy> <dirSad>;");
			return;
		}

		classificadorBayesNet = CommandLineParser
				.getClassificadorFromCommand(CommandLineParser.BAYES_NET);
		classificadorNaiveBayes = CommandLineParser
				.getClassificadorFromCommand(CommandLineParser.NAIVE_BAYES);
		classificadorArvore = CommandLineParser
				.getClassificadorFromCommand(CommandLineParser.J48);

		String diretorioArquivosHappy = args[0];
		String diretorioArquivosSad = args[1];

		addTests(diretorioArquivosHappy, "feliz");
		addTests(diretorioArquivosSad, "triste");

		System.out.println("==== Resultados dos Testes ====");
		output(classificadorNaiveBayes);
		output(classificadorBayesNet);
		output(classificadorArvore);
	}

	private static void addTests(String diretorioArquivos, String classe)
			throws UnsupportedEncodingException, FileNotFoundException,
			IOException {
		File diretorio = new File(diretorioArquivos);

		System.out.println("Adicionando testes aos classificadores"
				+ " com os arquivos do diretorio <" + diretorioArquivos
				+ ">. Os tweets sao do tipo <" + classe + ">.");

		for (File f : diretorio.listFiles()) {
			if (f.isHidden() || !f.getName().endsWith(".in")) {
				continue;
			}

			BufferedReader bf = new BufferedReader(new InputStreamReader(
					new FileInputStream(f), "UTF-8"));
			while (true) {
				String tweet = bf.readLine();
				if (tweet == null) {
					break;
				}
				if (tweet.trim().equals("")) {
					continue;
				}
				tweet = tweet.toLowerCase();
				classificadorBayesNet.test(tweet, classe);
				classificadorNaiveBayes.test(tweet, classe);
				classificadorArvore.test(tweet, classe);
			}
		}
	}

	private static void output(TweetClassifier classifier) {
		try {
			System.out.println("==== Avaliando classificador: "
					+ classifier.getClassifierInfo() + " ====");
			Evaluation evaluation = classifier.evaluate();
			System.out.println("Acertos na classe feliz: "
					+ evaluation.numTruePositives(0));
			System.out.println("Acertos na classe triste: "
					+ evaluation.numTruePositives(1));
			System.out.println(evaluation.toSummaryString());
		} catch (Exception e) {
			System.err.println("Erro na avaliação dos tweets: "
					+ e.getMessage());
		}
	}
}
